package com.zjcloud.jwgl.service;

import java.util.List;
import java.util.Map;
import com.zjcloud.jwgl.domain.*;

/**
 * 智能排课核心Service接口
 * 
 * @author zjcloud
 * @date 2024-12-19
 */
public interface IScScheduleService 
{
    /**
     * 创建排课任务
     * 
     * @param scheduleTask 排课任务
     * @return 结果
     */
    public int createScheduleTask(ScScheduleTask scheduleTask);

    /**
     * 执行排课任务
     * 
     * @param taskId 任务ID
     * @return 结果
     */
    public int executeScheduleTask(Long taskId);

    /**
     * 取消排课任务
     * 
     * @param taskId 任务ID
     * @return 结果
     */
    public int cancelScheduleTask(Long taskId);

    /**
     * 获取排课任务状态
     * 
     * @param taskId 任务ID
     * @return 任务状态
     */
    public ScScheduleTask getScheduleTaskStatus(Long taskId);

    /**
     * 获取排课结果
     * 
     * @param taskId 任务ID
     * @return 排课结果列表
     */
    public List<ScScheduleResult> getScheduleResults(Long taskId);

    /**
     * 获取排课结果（按教师分组）
     * 
     * @param taskId 任务ID
     * @return 排课结果Map
     */
    public Map<String, List<ScScheduleResult>> getScheduleResultsByTeacher(Long taskId);

    /**
     * 获取排课结果（按班级分组）
     * 
     * @param taskId 任务ID
     * @return 排课结果Map
     */
    public Map<String, List<ScScheduleResult>> getScheduleResultsByClass(Long taskId);

    /**
     * 获取排课结果（按教室分组）
     * 
     * @param taskId 任务ID
     * @return 排课结果Map
     */
    public Map<String, List<ScScheduleResult>> getScheduleResultsByClassroom(Long taskId);

    /**
     * 手动调整排课
     * 
     * @param resultId 排课结果ID
     * @param newTimeSlotId 新时间段ID
     * @param newClassroomId 新教室ID
     * @param reason 调整原因
     * @return 结果
     */
    public int adjustSchedule(Long resultId, Long newTimeSlotId, Long newClassroomId, String reason);

    /**
     * 批量调整排课
     * 
     * @param adjustments 调整列表
     * @return 结果
     */
    public int batchAdjustSchedule(List<Map<String, Object>> adjustments);

    /**
     * 确认排课结果
     * 
     * @param taskId 任务ID
     * @return 结果
     */
    public int confirmScheduleResults(Long taskId);

    /**
     * 发布排课结果
     * 
     * @param taskId 任务ID
     * @return 结果
     */
    public int publishScheduleResults(Long taskId);

    /**
     * 检查排课冲突
     * 
     * @param taskId 任务ID
     * @return 冲突列表
     */
    public List<Map<String, Object>> checkScheduleConflicts(Long taskId);

    /**
     * 检查约束违反
     * 
     * @param taskId 任务ID
     * @return 违反列表
     */
    public List<Map<String, Object>> checkConstraintViolations(Long taskId);

    /**
     * 获取排课统计信息
     * 
     * @param taskId 任务ID
     * @return 统计信息
     */
    public Map<String, Object> getScheduleStatistics(Long taskId);

    /**
     * 获取排课质量评分
     * 
     * @param taskId 任务ID
     * @return 质量评分
     */
    public Map<String, Object> getScheduleQualityScore(Long taskId);

    /**
     * 导出排课结果
     * 
     * @param taskId 任务ID
     * @param exportType 导出类型（excel、pdf等）
     * @return 导出文件路径
     */
    public String exportScheduleResults(Long taskId, String exportType);

    /**
     * 复制排课结果到新学期
     * 
     * @param sourceTaskId 源任务ID
     * @param targetSemesterId 目标学期ID
     * @return 结果
     */
    public int copyScheduleToNewSemester(Long sourceTaskId, Long targetSemesterId);

    /**
     * 清空排课结果
     * 
     * @param taskId 任务ID
     * @return 结果
     */
    public int clearScheduleResults(Long taskId);

    /**
     * 重新排课
     * 
     * @param taskId 任务ID
     * @return 结果
     */
    public int reschedule(Long taskId);

    /**
     * 获取可用时间段
     * 
     * @param teacherId 教师ID
     * @param classId 班级ID
     * @param classroomId 教室ID
     * @param date 日期
     * @return 可用时间段列表
     */
    public List<ScTimeSlot> getAvailableTimeSlots(Long teacherId, Long classId, Long classroomId, String date);

    /**
     * 获取推荐教室
     * 
     * @param courseId 课程ID
     * @param timeSlotId 时间段ID
     * @return 推荐教室列表
     */
    public List<ScClassroom> getRecommendedClassrooms(Long courseId, Long timeSlotId);

    /**
     * 获取排课建议
     * 
     * @param courseId 课程ID
     * @return 排课建议
     */
    public Map<String, Object> getScheduleSuggestions(Long courseId);
}